Sync against scheduler tail on other CPUs when context
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 17 Jan 2006 12:25:30 +0000 (13:25 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 17 Jan 2006 12:25:30 +0000 (13:25 +0100)
switching to a new VCPU. Otherwise we cannot pull the
VCPU's state off the other CPU.

Signed-off-by: Keir Fraser <keir@xensource.com>
xen/arch/x86/domain.c

index b38147211adc19de7e17a6064b10fdbbdec0c685..25746ab4f1c8ab62a965584824b388c9ee14158c 100644 (file)
@@ -738,8 +738,12 @@ void context_switch(struct vcpu *prev, struct vcpu *next)
     ASSERT(cpus_weight(dirty_mask) <= 1);
     if ( unlikely(!cpu_isset(cpu, dirty_mask) && !cpus_empty(dirty_mask)) )
     {
+        /* Make sure the next VCPU is not in a scheduling tail. */
+        while ( test_bit(_VCPUF_running, &next->vcpu_flags) )
+            cpu_relax();
         /* Other cpus call __sync_lazy_execstate from flush ipi handler. */
-        flush_tlb_mask(dirty_mask);
+        if ( !cpus_empty(next->vcpu_dirty_cpumask) )
+            flush_tlb_mask(next->vcpu_dirty_cpumask);
     }
 
     local_irq_disable();